// 引入threejs
import * as THREE from "three";
// 引入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";
// 引入lil gui
import {GUI} from "three/examples/jsm/libs/lil-gui.module.min.js"

// 创建场景
const scene = new THREE.Scene();

// 创建相机
const camera = new THREE.PerspectiveCamera(
  45, // 视角
  window.innerWidth / window.innerHeight, // 宽高比
  0.1, // 近平面
  1000 // 远平面
);

// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染器宽高
document.body.appendChild(renderer.domElement); // 将渲染器添加到body中


// 创建一个立方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const parentMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
// 设置为线框模式
parentMaterial.wireframe = true;
let parentCube = new THREE.Mesh(geometry, parentMaterial)
// 创建网格
const cube = new THREE.Mesh(geometry, material);
parentCube.add(cube);
parentCube.position.set(-3, 0, 0);
// parentCube.scale.set(2, 2, 2);
parentCube.rotation.x = Math.PI / 4;

// 位移缩放
// cube.position.x = 2;
cube.position.set(3, 0, 0);

// 设置立方体的放大
// cube.scale.set(2, 2, 2);
// 绕着X轴旋转
cube.rotation.x = Math.PI / 4;

// 将网格添加到场景中
scene.add(parentCube);

// 创建轨道控制器
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 开启阻尼
controls.dampingFactor = 0.05; // 阻尼系数
// controls.autoRotate = true; // 自动旋转
// controls.autoRotateSpeed = 0.05; // 旋转速度

// 设置相机位置
camera.position.z = 5;
camera.position.y = 2;
camera.position.x = 2;
camera.lookAt(0, 0, 0)

// 添加世界坐标辅助器
const axisHelper = new THREE.AxesHelper(5);
scene.add(axisHelper);

// 定义渲染函数
function animate() {
  controls.update(); // 更新控制器
  requestAnimationFrame(animate);
  // cube.rotation.x += 0.01;
  // cube.rotation.y += 0.01;
  renderer.render(scene, camera);
}

animate()

// 监听窗口变化
window.addEventListener("resize", () => {
  // 重置渲染器宽高比
  renderer.setSize(window.innerWidth, window.innerHeight)

  // 重置相机宽高比
  camera.aspect = window.innerWidth / window.innerHeight

  // 重置相机
  camera.updateProjectionMatrix()
})

// 全屏事件
let eventObj = {
  Fullscreen: function(){
    document.body.requestFullscreen()
  },
  ExitFullscreen: function(){
    document.exitFullscreen()
  }
}

// 创建Gui
const gui = new GUI()
gui.add(eventObj, "Fullscreen").name("全屏")
gui.add(eventObj, "ExitFullscreen").name("退出全屏")


// 创建一个组
const folder = gui.addFolder("立方体位置")

// 控制立方体位置
// gui.add(cube.position,"x",-5 , 5).name("立方体位置x")
/** 监听事件
 *  onChange : 每一次变动都会触发
 *  onFinishChange : 只有变动结束才会触发
 */
folder.add(cube.position,"x").min(-10).max(10).step(1).name("立方体位置x").onChange(val => console.log("立方体位置x : " + val))
folder.add(cube.position,"y").min(-10).max(10).step(1).name("立方体位置y").onFinishChange(val => console.log("立方体位置y : " + val))
folder.add(cube.position,"z").min(-10).max(10).step(1).name("立方体位置z")

gui.add(parentMaterial,"wireframe").name("父元素线框模式")

let colorParams = {
  cubeColor: "#0f0",
}

gui.addColor(colorParams, "cubeColor").name("子元素颜色").onChange(val => {
  material.color = new THREE.Color(val)
})